/*
 * @Author: Colin Dai
 * @Date: 2022-04-30 17:29:49
 * @LastEditors: Colin Dai
 * @LastEditTime: 2022-05-03 12:19:30
 * @FilePath: \intelligent-trash\src\dist_detect.ino
 * @Description: 通过SR04超声波传感器进行测距
 * dailianzheng@163.com
 * Copyright (c) 2022 by Colin.Dai, All Rights Reserved. 
 */

#include "dist_detect.h"

 
#define Trig  A0                                          // 设定SR04连接的Arduino引脚
#define Echo  A1


//设定认为是否碰撞到的最小距离
#define NEARBY_DISTANCE 30




/**
 * @brief 初始化距离探测
 * @param {*}
 * @return {*}
 */
void init_detect() 
{  
    Serial.println("init_detect...");

    //SR04的引脚                                 
    pinMode(Trig, OUTPUT);  

    pinMode(Echo, INPUT);                                  //要检测引脚上输入的脉冲宽度，需要先设置为输入状态
   
} 

/**
 * @brief 测试距离
 * @param {*}
 * @return {*}
 */
void test_dist_detect() 
{ 
    Serial.println("The distance is :");

    double distance,time ; 

    digitalWrite(Trig, LOW);                                 
    delayMicroseconds(2);                                   
    digitalWrite(Trig, HIGH);                               
    delayMicroseconds(10);                                  //产生一个10us的高脉冲去触发SR04
    digitalWrite(Trig, LOW);                                
    
    time = pulseIn(Echo, HIGH);                              // 检测脉冲宽度，注意返回值是微秒us
    distance = time /58 ;                                  //计算出距离,输出的距离的单位是厘米cm

    Serial.print(distance);                                //把得到的距离值通过串口通信返回给电脑，通过串口监视器显示出来
    Serial.println("cm"); 
}


/**
 * @brief 判断是否可以前进
 * @param {*}
 * @return {*}
 */
boolean can_forward()
{
    double distance,time ; 
    digitalWrite(Trig, LOW);                                 
    delayMicroseconds(2);                                   
    digitalWrite(Trig, HIGH);                               
    delayMicroseconds(10);                                  //产生一个10us的高脉冲去触发SR04
    digitalWrite(Trig, LOW);                                
    
    time = pulseIn(Echo, HIGH);                              // 检测脉冲宽度，注意返回值是微秒us
    distance = time /58 ;                                  //计算出距离,输出的距离的单位是厘米cm

    Serial.print(distance);                                //把得到的距离值通过串口通信返回给电脑，通过串口监视器显示出来
    Serial.println("cm"); 

    if(distance > NEARBY_DISTANCE)
    {
        return true;
    }

    //默认不允许前进
    return false;
}